import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.params.SetParams;

import java.util.Set;

public class RedisDemoGeneric {

    public static void testGetSet(Jedis jedis) {
        System.out.println("set 和 get 的使用：");
        //先清空数据库
        //要避免上一组测试的残留数据影响到下一组测试的结果
        //清空当前数据库
        jedis.flushDB();
        //清空所有数据库
        jedis.flushAll();
        jedis.set("key","111");
        jedis.set("key2","222");
        //用于构建 Redis 的 SET 命令参数
        SetParams params = new SetParams();
        //设置超时时间
        params.ex(10);
        //仅在键不存在时操作
        //params.nx();
        //xx()：仅在键已存在时操作
        params.xx();
        jedis.set("key","333",params);
        String value = jedis.get("key");
        System.out.println("value = " + value);
    }

    public static void test2(Jedis jedis){
        System.out.println("existe 和 del 的使用");
        jedis.flushAll();
        jedis.set("key","111");
        jedis.set("key2","222");
        jedis.set("key3","222");

        boolean result = jedis.exists("key");
        System.out.println("result = " + result);

        long result2 = jedis.del("key");
        System.out.println("result2 = " + result2);

        result = jedis.exists("key");
        System.out.println("result = " + result);

        result2 = jedis.del("key", "key2", "key3");
        System.out.println("result2 = " + result2);
    }

    public static void test3(Jedis jedis){
        System.out.println("keys 的使用");
        jedis.flushAll();
        jedis.set("key","111");
        jedis.set("key2","222");
        jedis.set("key3","333");
        jedis.set("key4","444");
        //redis 中的 key 不能重复，不用在意顺序，用set来接收
        Set<String> keys = jedis.keys("*");
        System.out.println(keys);
    }

    public static void test4(Jedis jedis){
        System.out.println("expire 和 ttl 的使用");
        jedis.flushAll();
        jedis.set("key","111");
        jedis.expire("key",10);

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        long time = jedis.ttl("key");
        System.out.println("time = " + time);
    }

    public static void test5(Jedis jedis){
        System.out.println("type 的使用");
        jedis.flushAll();
        jedis.set("key","111");
        String type = jedis.type("key");
        System.out.println("type = " + type);

        jedis.lpush("key2","222");
        type = jedis.type("key2");
        System.out.println("type = " + type);

        jedis.hset("key3","f1","111");
        type = jedis.type("key3");
        System.out.println("type = " + type);

        jedis.sadd("key4","111","222","333");
        type = jedis.type("key4");
        System.out.println("type = " + type);

        jedis.zadd("key5",10,"zhangsan");
        type = jedis.type("key5");
        System.out.println("type = " + type);


    }



    public static void main(String[] args) {
//        首先要连接到redis服务器上
        //JedisPool 相当于redis连接池

        JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");
        //在 try 里面创建 jedis 对象 相当于从 池子里面取出来一个具体的连接
        //连接 用完之后 要记得释放
        //此处的释放，不一定是真正关闭tcp连接，而是放回到池子里面
        //用try就不用写 关闭操作了，因为try代码块结束之后会自动调用关闭操作

        try (Jedis jedis = jedisPool.getResource()){
            //redis 的各种命令就对应到 jedis 对象的各种方法了

            //验证服务器的连接性
//            String pong = jedis.ping();
//            System.out.println(pong);

//            testGetSet(jedis);
//            test2(jedis);
            test3(jedis);
//            test4(jedis);
//            test5(jedis);
        }
    }
}
